package com.example.springbootpro.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.Calendar;


public class JWTUtils {
    private static final String SECRET = "mySecretKey";
    public static final int EXPIRATION_DAYS = 7;

    /**
     * 生成包含用户名和MD5加密密码的JWT token
     * @param username 用户名
     * @param password 原始密码（未加密）
     * @return JWT token
     */
    public static String generateToken(String username, String password) {
        // 对密码进行MD5加密
        String encryptedPassword = md5Encrypt(password);
         Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, EXPIRATION_DAYS);

        return JWT.create()
                .withClaim("username", username)
                .withClaim("password", encryptedPassword)
                .withExpiresAt(calendar.getTime())
                .sign(Algorithm.HMAC256(SECRET));
    }

    /**
     * 验证并解析JWT token
     * @param token JWT token
     * @return DecodedJWT 对象
     */
    public static DecodedJWT verifyToken(String token) {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        return verifier.verify(token);
    }

    /**
     * 从token中获取用户名
     * @param token JWT token
     * @return 用户名
     */
    public static String getUsernameFromToken(String token) {
        DecodedJWT decodedJWT = verifyToken(token);
        return decodedJWT.getClaim("username").asString();
    }

    /**
     * 从token中获取加密后的密码
     * @param token JWT token
     * @return MD5加密后的密码
     */
    public static String getEncryptedPasswordFromToken(String token) {
        DecodedJWT decodedJWT = verifyToken(token);
        return decodedJWT.getClaim("password").asString();
    }

    /**
     * MD5加密方法
     * @param input 原始字符串
     * @return MD5加密后的字符串
     */
    public static String md5Encrypt(String input) {
        return DigestUtils.md5Hex(input);
    }

    /**
     * 验证密码是否匹配
     * @param inputPassword 用户输入的密码
     * @param encryptedPassword 加密后的密码（通常从数据库或token中获取）
     * @return 是否匹配
     */
    public static boolean validatePassword(String inputPassword, String encryptedPassword) {
        return md5Encrypt(inputPassword).equals(encryptedPassword);
    }

    // 测试方法
    public static void main(String[] args) {
        String username = "zuser";
        String password = "zuser123";

        // 生成token
        String token = generateToken(username, password);
        System.out.println("Generated Token: " + token+"fgfdg");
//        System.out.println(verifyToken("12313123.123123.3213123"));
        // 从token中解析信息
        String parsedUsername = getUsernameFromToken(token);
        String parsedPassword = getEncryptedPasswordFromToken(token);

        System.out.println("Username from token: " + parsedUsername);
        System.out.println("Encrypted password from token: " + parsedPassword);

        // 验证密码
        System.out.println("Password validation (correct): " +
                validatePassword("zuser123", parsedPassword));
        System.out.println("Password validation (wrong): " +
                validatePassword("wrongpass", parsedPassword));
    }
}